home *** CD-ROM | disk | FTP | other *** search
/ Aminet 6 / Aminet 6 - June 1995.iso / Aminet / misc / amag / AM95047.lha / p4 / src.lha / src / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-09  |  9.5 KB  |  429 lines

  1. #include "Main.h"
  2. #include "text.h"
  3. #include "protos.h"
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <dos/dos.h>
  8. #include <proto/exec.h>
  9. #include <proto/intuition.h>
  10. #include <proto/gadtools.h>
  11. #include <proto/keymap.h>
  12. #include <proto/graphics.h>
  13. #include <proto/reqtools.h>
  14. #include <libraries/reqtools.h>
  15. #include <graphics/gfxmacros.h>
  16. #include <exec/memory.h>
  17. #include <intuition/gadgetclass.h>
  18.  
  19.  
  20. UBYTE NiveauCourant=4;
  21. extern UBYTE ListeCoup[XMAX*YMAX+1];
  22. UWORD CoorX[XMAX+1],CoorY[YMAX+1];
  23.  
  24. struct ReqToolsBase *ReqToolsBase;
  25. struct Library *GadToolsBase;
  26. struct IntuitionBase *IntuitionBase;
  27. struct Library *KeymapBase;
  28. struct GfxBase *GfxBase ;
  29.  
  30. #define BEEP DisplayBeep(Ecran);
  31. #define U_N (GT_Underscore),'_'
  32.  
  33. struct Screen    *Ecran=NULL;
  34. APTR        VisualInfo=NULL;
  35. struct Window    *Fenetre=NULL;
  36. struct Gadget    *GadgetsListe=NULL;
  37. struct Menu    *MenusListe=NULL;
  38. struct Gadget    *Gadget[NBGADGETS];
  39. struct RastPort    *Rastport;
  40.  
  41. UWORD FenLeft=108,FenTop=15,FenWidth=497,FenHeight=147;
  42. UBYTE         *FenetreTitre=TITRE;
  43. ULONG flag=WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_REPORTMOUSE|WFLG_GIMMEZEROZERO|WFLG_ACTIVATE;
  44. ULONG idcmp=IDCMP_GADGETUP|IDCMP_MENUPICK|IDCMP_MOUSEBUTTONS|IDCMP_RAWKEY|IDCMP_CLOSEWINDOW;
  45.  
  46. UWORD Correction=1;
  47. char drapeau;
  48.  
  49. UBYTE *Niveaux[]={"1","2","3",NULL};
  50.  
  51. struct TextAttr topaz8={"topaz.font",8,0x00,0x01};
  52.  
  53. struct NewMenu Menu[]={
  54.  NM_TITLE,PROJET,NULL,0,NULL,NULL,
  55.  NM_ITEM,INFOS,INF,0,0,(APTR)Infos,
  56.  NM_ITEM,NM_BARLABEL,NULL,0,0,NULL,
  57.  NM_ITEM,QUITTE,QUI,0,0,(APTR)Quitte,
  58.  NM_END,NULL,NULL,0,0,NULL
  59. };
  60.  
  61. UWORD FGTypes[]={
  62.  CYCLE_KIND,
  63.  TEXT_KIND,
  64.  BUTTON_KIND,
  65.  BUTTON_KIND,
  66.  BUTTON_KIND,
  67.  BUTTON_KIND
  68. };
  69.  
  70. struct NewGadget NewGadget[]={
  71.  400,10,61,11,NIVEAU,NULL,0,PLACETEXT_LEFT,NULL,(APTR)Niveau,
  72.  2,118,480,11,NULL,NULL,1,0,NULL,NULL,
  73.  360,42,85,11,COMMENCE,NULL,2,PLACETEXT_IN,NULL,(APTR)Commence,
  74.  360,54,85,11,ARRETE,NULL,3,PLACETEXT_IN,NULL,(APTR)Arrete,
  75.  360,66,84,11,QUITTE_G,NULL,4,PLACETEXT_IN,NULL,(APTR)Quitte,
  76.  360,85,84,11,RETOUR,NULL,5,PLACETEXT_IN,NULL,(APTR)Retour,
  77.  TAG_DONE
  78. };
  79.  
  80. ULONG GadgetTag[]={
  81.  GTCY_Labels,(ULONG)Niveaux,GTCY_Active,1,U_N,TAG_DONE,
  82.  GTTX_Text,(ULONG)BONJOUR,GTTX_Border,1,TAG_DONE,
  83.  U_N,TAG_DONE,
  84.  U_N,GA_Disabled,1,TAG_DONE,
  85.  U_N,TAG_DONE,
  86.  U_N,GA_Disabled,1,TAG_DONE
  87. };
  88.  
  89. int InitEcran(void)
  90. {
  91.  if(!(Ecran=LockPubScreen("Workbench")))
  92.   return(1L);
  93.  if(!(VisualInfo=GetVisualInfo(Ecran,TAG_DONE)))
  94.   return(2L);
  95.  return(0);
  96. }
  97.  
  98. void FermeEcran(void)
  99. {
  100.  if(VisualInfo)
  101.  {
  102.   FreeVisualInfo(VisualInfo);
  103.   VisualInfo=NULL;
  104.  }
  105.  if(Ecran)
  106.  {
  107.   UnlockPubScreen(NULL,Ecran);
  108.   Ecran=NULL;
  109.  }
  110. }
  111.  
  112. void UpdateBevel(void)
  113. {
  114.  UWORD offx,offy,i;
  115.  UWORD Pattern[]={0xAAAA,0x5555};
  116.  
  117.  offx=Fenetre->BorderLeft;
  118.  offy=Fenetre->BorderTop;
  119.  
  120.  DrawBevelBox(Rastport,offx+348,offy+38,109,65,GT_VisualInfo,VisualInfo,GTBB_Recessed,1,TAG_DONE);
  121.  DrawBevelBox(Rastport,offx+16,offy-2,297,113*Correction,GT_VisualInfo,VisualInfo,TAG_DONE);
  122.  DrawBevelBox(Rastport,offx+20,offy,289,109*Correction,GT_VisualInfo,VisualInfo,GTBB_Recessed,1,TAG_DONE);
  123.  SetAfPt(Rastport,Pattern,1);
  124.  SetAPen(Rastport,3);
  125.  RectFill(Rastport,offx+350,offy+39,offx+455,offy+100);
  126.  RefreshGadgets(GadgetsListe,Fenetre,NULL);
  127.  SetAPen(Rastport,1);
  128.  for(i=0;i<=XMAX;i++)
  129.  {
  130.   CoorX[i]=offx+VS+i*TN+1+(TN>>1);
  131.   if(i<=YMAX)
  132.    CoorY[i]=offy+(CC-((i*(TN-5))>>1)-((TN-5)>>2)+2)*Correction;
  133.  
  134.   Move(Rastport,offx+VS+i*TN,offy+CI);
  135.   Draw(Rastport,offx+VS+i*TN,offy+CC*Correction);
  136.   Move(Rastport,offx+VS+1+i*TN,offy+CI);
  137.   Draw(Rastport,offx+VS+1+i*TN,offy+CC*Correction);
  138.  }
  139. }
  140.  
  141. void GereEvenements(void)
  142. {
  143.  struct MenuItem *ItemMenu;
  144.  UBYTE buffer[80];
  145.  UWORD i,actual;
  146.  struct InputEvent Clavier;
  147.  void (*func)(void);
  148.  struct IntuiMessage *Message;
  149.  struct IntuiMessage Msg;
  150.  
  151.  Wait(1<<Fenetre->UserPort->mp_SigBit);
  152.  while(Message=GT_GetIMsg(Fenetre->UserPort))
  153.  {
  154.   Msg=*Message;
  155.   GT_ReplyIMsg(Message);
  156.   switch(Msg.Class)
  157.   {
  158.    case IDCMP_CLOSEWINDOW:
  159.     drapeau=1;
  160.     Quitte();
  161.     break;
  162.  
  163.    case IDCMP_RAWKEY:
  164.     Clavier.ie_Qualifier=Msg.Qualifier;
  165.     if(Clavier.ie_Qualifier&IEQUALIFIER_RCOMMAND)
  166.     {
  167.      Clavier.ie_Class=IECLASS_RAWKEY;
  168.      Clavier.ie_SubClass=0;
  169.      Clavier.ie_Code=Msg.Code;
  170.      Clavier.ie_EventAddress=(APTR *)*((ULONG *)Msg.IAddress);
  171.      actual=MapRawKey(&Clavier,buffer,80,NULL);
  172.      for(i=0;i<actual;i++)
  173.       switch(buffer[i])
  174.       {
  175.        case COM:
  176.         if(Enabled(Gadget[2]))
  177.          Commence();
  178.         break;
  179.        case ARR:
  180.         if(Enabled(Gadget[3]))
  181.          Arrete();
  182.         break;
  183.        case RET:
  184.         if(Enabled(Gadget[5]))
  185.          Retour();
  186.         break;
  187.        case NIV:
  188.         if(Enabled(Gadget[0]))
  189.          CycleNiveau();
  190.         break;
  191.       }
  192.     }
  193.     break;
  194.  
  195.    case IDCMP_MOUSEBUTTONS:
  196.     if(Msg.Code==SELECTDOWN)
  197.      Souris();
  198.     break;
  199.  
  200.    case IDCMP_GADGETUP:
  201.     func=(void *)(((struct Gadget *)Msg.IAddress)->UserData);
  202.     (func)();
  203.     break;
  204.  
  205.    case IDCMP_MENUPICK:
  206.     drapeau=0;
  207.     while(Msg.Code!=MENUNULL)
  208.     {
  209.      ItemMenu=ItemAddress(MenusListe,Msg.Code);
  210.      func=(void *)(GTMENUITEM_USERDATA(ItemMenu));
  211.      (func)();
  212.      Msg.Code=ItemMenu->NextSelect;
  213.     }
  214.     break;
  215.   }
  216.  }
  217. }
  218.  
  219. char GereEvenementsLight(void)
  220. {
  221.  struct IntuiMessage *Message;
  222.  char buffer[80];
  223.  UWORD i,actual;
  224.  struct InputEvent Clavier;
  225.  
  226.  while(Message=GT_GetIMsg(Fenetre->UserPort))
  227.  {
  228.   GT_ReplyIMsg(Message);
  229.   switch(Message->Class)
  230.   {
  231.    case IDCMP_RAWKEY:
  232.     Clavier.ie_Qualifier=Message->Qualifier;
  233.     if(Clavier.ie_Qualifier&IEQUALIFIER_RCOMMAND)
  234.     {
  235.      Clavier.ie_Class=IECLASS_RAWKEY;
  236.      Clavier.ie_SubClass=0;
  237.      Clavier.ie_Code=Message->Code;
  238.      Clavier.ie_EventAddress=(APTR *)*((ULONG *)Message->IAddress);
  239.      actual=MapRawKey(&Clavier,buffer,80,NULL);
  240.      for(i=0;i<actual;i++)
  241.       if(buffer[i]==ARR)
  242.        return(1);
  243.     }
  244.     break;
  245.    case IDCMP_GADGETUP:
  246.     if(((struct Gadget *)Message->IAddress)->GadgetID==3);
  247.      return(1);
  248.     break;
  249.   }
  250.  }
  251.  return(0);
  252. }
  253.  
  254. int OuvreFenetre(void)
  255. {
  256.  struct Gadget *g;
  257.  UWORD lc,tc;
  258.  UWORD offx=Ecran->WBorLeft,offy=Ecran->WBorTop+Ecran->RastPort.TxHeight+1;
  259.  
  260.  if(!(g=CreateContext(&GadgetsListe)))
  261.   return(1L);
  262.  
  263.  for(lc=0,tc=0;;lc++)
  264.  {
  265.   if(!NewGadget[lc].ng_LeftEdge)
  266.    break;
  267.  
  268.   NewGadget[lc].ng_VisualInfo=VisualInfo;
  269.   NewGadget[lc].ng_TextAttr=&topaz8;
  270.   NewGadget[lc].ng_LeftEdge+=offx;
  271.   NewGadget[lc].ng_TopEdge+=offy;
  272.  
  273.   if((Correction==2)&&(lc==1))
  274.    NewGadget[1].ng_TopEdge<<=1;
  275.   Gadget[lc]=g=CreateGadgetA((ULONG)FGTypes[lc],g,&NewGadget[lc],(struct TagItem *)&GadgetTag[tc]);
  276.  
  277.   while(GadgetTag[tc])
  278.    tc+=2;
  279.   tc++;
  280.  
  281.   if(!g)
  282.    return(2L);
  283.  }
  284.  
  285.  if(!(MenusListe=CreateMenus(Menu,GTMN_FrontPen,0,TAG_DONE)))
  286.   return(3L);
  287.  
  288.  LayoutMenus(MenusListe,VisualInfo,GTMN_TextAttr,&topaz8,TAG_DONE);
  289.  
  290.  if(!(Fenetre=OpenWindowTags(NULL,
  291.     WA_Left,FenLeft,
  292.     WA_Top,FenTop,
  293.     WA_Width,FenWidth,
  294.     WA_Height,FenHeight*Correction+offy,
  295.     WA_IDCMP,idcmp^IDCMP_MOUSEBUTTONS,
  296.     WA_Flags,flag,
  297.     WA_Gadgets,GadgetsListe,
  298.     WA_Title,FenetreTitre,
  299.     WA_ScreenTitle,NULL,
  300.     WA_PubScreen,Ecran,
  301.     TAG_DONE)))
  302.   return(4L);
  303.  
  304.  Rastport=Fenetre->RPort;
  305.  SetMenuStrip(Fenetre,MenusListe);
  306.  
  307.  GT_RefreshWindow(Fenetre,NULL);
  308.  UpdateBevel();
  309.  return(0);
  310. }
  311.  
  312. void FermeFenetre(void)
  313. {
  314.  if(MenusListe)
  315.  {
  316.   ClearMenuStrip(Fenetre);
  317.   FreeMenus(MenusListe);
  318.   MenusListe=NULL;
  319.  }
  320.  if(Fenetre)
  321.  {
  322.   CloseWindow(Fenetre);
  323.   Fenetre=NULL;
  324.  }
  325.  if(GadgetsListe)
  326.  {
  327.   FreeGadgets(GadgetsListe);
  328.   GadgetsListe=NULL;
  329.  }
  330. }
  331.  
  332. void CycleNiveau(void)
  333. {
  334.  struct TagItem tk[]={GTCY_Active,0,TAG_DONE};
  335.  
  336.  Niveau();
  337.  tk[0].ti_Data=(NiveauCourant>>1)-1;
  338.  GT_SetGadgetAttrsA(Gadget[0],Fenetre,NULL,tk);
  339.  RefreshGList(Gadget[0],Fenetre,NULL,1);
  340. }
  341.  
  342. void Niveau(void)
  343. {
  344.  NiveauCourant%=6;
  345.  NiveauCourant+=2;
  346. }
  347.  
  348. void Affiche(char *txt)
  349. {
  350.  struct TagItem tk[]={GTTX_Text,0,TAG_DONE};
  351.  
  352.  tk[0].ti_Data=(ULONG)txt;
  353.  GT_SetGadgetAttrsA(Gadget[1],Fenetre,NULL,tk);
  354.  
  355. void Quitte(void)
  356. {
  357.  struct TagItem tk[]={RT_Window,NULL,RTEZ_ReqTitle,(ULONG)QUI_TIT,RT_ReqPos,REQPOS_CENTERSCR,RTEZ_Flags,EZREQF_CENTERTEXT,TAG_DONE};
  358.  
  359.  tk[0].ti_Data=(ULONG)Fenetre;
  360.  if((drapeau)||(rtEZRequestA(QUI_TXT,QUI_REP,NULL,NULL,tk)))
  361.  {
  362.   FermeFenetre();
  363.   FermeEcran();
  364.   exit(RETURN_OK);
  365.  }
  366. }
  367.  
  368. void Infos(void)
  369. {
  370.  ULONG pipo[2];
  371.  struct TagItem tk[]={RT_Window,NULL,RTEZ_ReqTitle,(ULONG)OUI_TIT,RT_ReqPos,REQPOS_CENTERSCR,RTEZ_Flags,EZREQF_CENTERTEXT,TAG_DONE};
  372.  
  373.  pipo[0]=AvailMem(MEMF_LARGEST|MEMF_CHIP);
  374.  pipo[1]=AvailMem(MEMF_LARGEST|MEMF_FAST);
  375.  tk[0].ti_Data=(ULONG)Fenetre;
  376.  rtEZRequestA(OUI_TXT,OUI_REP,NULL,pipo,tk);
  377.  RefreshGList(Gadget[1],Fenetre,NULL,1);
  378. }
  379.  
  380. int main()
  381. {
  382.  int a,b;
  383.  static UBYTE version[]=VERSION;
  384.  
  385.  if(!(GadToolsBase=(struct Library *)OpenLibrary("gadtools.library",VER_LIB)))
  386.  {
  387.   printf("%s gadtools.library v%d",VER_PBM,VER_LIB);
  388.   exit(RETURN_ERROR);
  389.  }
  390.  if(!(KeymapBase=(struct Library *)OpenLibrary("keymap.library",VER_LIB)))
  391.  {
  392.   printf("%s keymap.library v%d",VER_PBM,VER_LIB);
  393.   exit(RETURN_ERROR);
  394.  }
  395.  if(!(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",VER_LIB)))
  396.  {
  397.   printf("%s graphics.library v%d",VER_PBM,VER_LIB);
  398.   exit(RETURN_ERROR);
  399.  }
  400.  if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",VER_LIB)))
  401.  {
  402.   printf("%s intuition.library v%d",VER_PBM,VER_LIB);
  403.   exit(RETURN_ERROR);
  404.  }
  405.  if(!(ReqToolsBase=(struct ReqToolsBase*)OpenLibrary("reqtools.library",VER_LIB)))
  406.  {
  407.   printf("%s reqtools.library v%d",VER_PBM,VER_LIB);
  408.   exit(RETURN_ERROR);
  409.  }
  410.  if(a=InitEcran())
  411.  {
  412.   printf("%s InitEcran. Erreur %d\n",VER_PBM,a);
  413.   exit(RETURN_ERROR);
  414.  }
  415.  if(Ecran->Height>350)
  416.   Correction=2;
  417.  if(b=OuvreFenetre())
  418.  {
  419.   FermeEcran();
  420.   printf("%s OuvreFenetre. Erreur %d\n",VER_PBM,a);
  421.   exit(RETURN_ERROR);
  422.  }
  423.  Init();
  424.  Commence();
  425.  for(;;)
  426.   GereEvenements();
  427. }
  428.